/*
 * @Author: Fan Dong
 * @Date: 2021-06-24 09:59:01
 * @LastEditors: Fan Dong
 * @LastEditTime: 2021-06-24 11:23:32
 * @Description: 文件描述
 * @FilePath: \learn-typescript\ts\2.函数.ts
 */
// es5 定义函数

// 函数声明式
// function run() {
//   return "run";
// }
// // 匿名函数
// let run3 = function () {
//   return "33";
// };

// ts定义函数的方法

// 函数声明式
function a1(): string {
  return "123";
}
// 错误写法
// function a2(): string{
//   return 123
// }

// 匿名函数

let fun2 = function (): number {
  return 456;
};

// ts定义方法传参

// 函数声明式
function getInfo(name: string, age: number): string {
  return name + age;
}

console.log(getInfo("fred", 18));

// 匿名函数

let getInfo2 = function (name: string, age: number): string {
  return name + age;
};

console.log(getInfo2("fred", 20));

// 没有返回值的方法
function rr(): void {
  console.log("没有返回值");
}
rr();

// 方法的可选参数

// es5里面方法的形参是实参可以不一样,但在ts中必须一样,如果不一样就需要配置可选参数
function getInfo3(name: string, age?: number): string {
  if (age) {
    return name + age;
  } else {
    return name;
  }
}

console.log(getInfo3("liming", 99));

// 默认参数
function getInfo4(name: string, age: number = 20): string {
  return name + age;
}

console.log(getInfo4("fred"));

// 剩余参数

// function sum(a: number, b: number, c: number, d: number): number {
//   return a + b + c + d;
// }

// console.log(sum(1, 2, 3, 4));
// 三点运算法 接受新参数传过来的值
function sum2(...result: number[]): number {
  let sum = 0;

  for (let i = 0; i < result.length; i++) {
    sum += result[i];
  }

  return sum;
}

console.log(sum2(1, 2, 3, 4, 5, 6));

function sum3(a: number, ...result: number[]): number {
  let sum = a;

  for (let i = 0; i < result.length; i++) {
    sum += result[i];
  }

  return sum;
}

console.log(sum3(1, 2, 3, 4, 5, 6));

// 函数的重载

// java中方法的重载：重载指的是两个或者两个以上同名函数，但他们的参数不一样，这时会出现重载的情况。
// ts中的重载：通过同为一个函数提供多个函数类型定义来试下多种功能的目的。
// ts为了兼容es5 以及重载的写法和java有区别

// es5中出现同名的方法，下面会替换上面的方法。

/*
function css(config){

}

function css(config,value){

}
*/

// ts 中的重载
// function getObj(name: string): string;
// function getObj(age: number): string;
// function getObj(str: any): any {
//   if (typeof str === "string") {
//     return "我叫" + str;
//   } else {
//     return "我的年龄是" + str;
//   }
// }

// console.log(getObj("张三")); // 正确写法
// console.log(getObj(20)); // 正确写法
// // console.log(getObj(true)) // 错误写法

function getObj2(name: string): string;
function getObj2(name: string, age: number): string;
function getObj2(name: any, age?: any): any {
  if (age) {
    return "我叫" + name + "我的年龄是" + age;
  } else {
    return "我叫" + name;
  }
}


console.log(getObj2('张三'))
console.log(getObj2('张三',18))
// console.log(getObj2(18)) // 错误
// console.log(getObj2('张三',true)) // 错误


// 箭头函数es6   this指向上下文
setTimeout(function(){
  console.log('run')
},1000)

setTimeout(()=>{
  console.log('22')
},1000)